home *** CD-ROM | disk | FTP | other *** search
/ Logiciels PC Special 3 / Logiciel PC - Hors-Serie 3.iso / Logs / micros / ql / outils / qltoolsq / source / msdos / msdos.c < prev    next >
C/C++ Source or Header  |  1996-07-14  |  3KB  |  192 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <time.h>
  5. #include <fcntl.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <bios.h>
  9. #include <dos.h>
  10. #include <io.h>
  11. #include <conio.h>
  12.  
  13. #include "qltools.h"
  14.  
  15. static short use_fd = 0;
  16.  
  17. #ifdef __WATCOMC__
  18. ushort biosdisk (ushort service, ushort drive, ushort side, ushort track,
  19.          ushort sector, ushort nsector, void *buffer)
  20. {
  21.     struct diskinfo_t di;
  22.     ushort status;
  23.  
  24.     di.drive = drive;
  25.     di.head = side;
  26.     di.track = track;
  27.     di.sector = sector;
  28.     di.nsectors = nsector;
  29.     di.buffer = buffer;
  30.     status = _bios_disk (service, &di);
  31.     return status;
  32. }
  33. #endif
  34.  
  35. time_t GetTimeZone(void)
  36. {
  37.     return 0;
  38. }
  39.  
  40. int ReadQLSector(int fd, void *buf, int sect)
  41. {
  42.     long fpos;
  43.     long err;
  44.     if (!use_fd)
  45.     {
  46.     short side;
  47.     short track;
  48.     short sector;
  49.     if(sect)
  50.     {
  51.         side = LTP_SIDE(sect);
  52.         track = LTP_TRACK(sect);
  53.         sector = LTP_SECT(sect);
  54.     }
  55.     else
  56.     {
  57.         side = track = 0;
  58.         sector = 1;
  59.     }
  60.     
  61.     if (biosdisk (_DISK_READ, fd, side, track, sector, 1, buf) & 0xff00)
  62.         err = -1;
  63.     }
  64.     else
  65.     {
  66.     fpos = (sect) ? LTP (sect) : 0;
  67.     err = lseek (fd, fpos, SEEK_SET);
  68.     if (err < 0)
  69.     {
  70.         perror ("read sector: lseek():");
  71.     }
  72.     else
  73.     {
  74.         err = read (fd, buf, GSSIZE);
  75.     }
  76.     }
  77.     return err;
  78. }
  79.  
  80. int WriteQLSector (int fd, void *buf, int sect)
  81. {
  82.     long fpos;
  83.     long err;
  84.     
  85.     if (!use_fd)
  86.     {
  87.     if ((err = biosdisk (_DISK_WRITE, fd, 
  88.                  LTP_SIDE (sect), LTP_TRACK (sect), 
  89.                  LTP_SECT (sect), 1, buf)) & 0xff00)
  90.         if (err == 0x300)
  91.         {
  92.         fputs ("Write Protected\n", stderr);
  93.         exit (0);
  94.         }
  95.         else
  96.         err = -1;
  97.     }
  98.     else
  99.     {
  100.     err = lseek (fd, LTP (sect), SEEK_SET);
  101.     if (err < 0)
  102.         perror ("write sector: lseek():");
  103.     else
  104.         err = write (fd, buf, GSSIZE);
  105.     }
  106.     return err;
  107. }
  108.  
  109. int OpenQLDevice (char *name, int mode)
  110. {
  111.     int status;
  112.     int fd;
  113.     char buf[512];
  114.     
  115.     if (*(name + 1) == ':')
  116.     {
  117.     switch (*name)
  118.     {
  119.         case 'a':
  120.         case 'A':
  121.         fd = 0;
  122.         break;
  123.         case 'b':
  124.         case 'B':
  125.         fd = 1;
  126.         break;
  127.         default:
  128.         usage ("Bad drive: use a: or b:");
  129.         break;
  130.     }
  131.  
  132.         /* reset the disk */
  133.         status = biosdisk (_DISK_READ, fd, 0, 10, 1, 1, buf);
  134.  
  135.         /* change signal ? */
  136.         if (status == 0x06)
  137.         status = biosdisk (_DISK_READ, fd, 0, 0, 1, 1, buf);
  138.  
  139.     status = biosdisk (_DISK_RESET, fd, 0, 0, 0, 0, NULL);
  140.     if (status != 0)
  141.         {
  142.         fprintf (stderr, "Disk not ready (continuing...)\n");
  143.         fd = -1;
  144.         }
  145.     }
  146.     else
  147.     {
  148.     use_fd = 1;
  149.     mode |= O_BINARY;
  150.     fd = open (name, mode);
  151.     }
  152.     return fd;
  153. }
  154.  
  155. void CloseQLDevice(int fd)
  156. {
  157.     if(use_fd)
  158.     {
  159.     close(fd);
  160.     }
  161. }
  162.  
  163. void ZeroSomeSectors(int fd, short flag)
  164. {
  165.     int i, t,h,s;
  166.     char buf[512];
  167.  
  168.     memset(buf, '\0', 512);
  169.     if(flag == 'd')
  170.     {
  171.     flag = 9;
  172.     }
  173.     else
  174.     {
  175.     flag = 18;
  176.     }
  177.     
  178.     for(i = t = 0; ; t++)
  179.     {
  180.     for(h = 0; h < 2; h++)
  181.     {
  182.         for(s = 0; s < flag; s++)
  183.         {
  184.         biosdisk (_DISK_WRITE, fd, h, t, s, 1, buf);
  185.         i++;
  186.         if(i == 36) return;
  187.         }
  188.     }
  189.     }
  190.     
  191. }
  192.